/*
 * @ Dmitry Farafonov
 */

(function($) {
	$.ProgressBar = function(options) {
		this.element = $(options.boundingBox);
		if (options.on && options.on.complete) {
			this.onComplete = options.on.complete;
		}
		if (options.on && options.on.valueChange) {
			this.onValueChange = options.on.valueChange;
		}

		this._create();

		if (options.label)
			this.set("label", options.label);
		if (options.value)
			this.value(options.value);
		if (options.max)
			this.set("max", options.max);
	};
	$.ProgressBar.prototype = {
		options : {
			value : 0,
			max : 100
		},

		min : 0,

		_create : function() {
			this.element
					.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all")
					.attr({
								role : "progressbar",
								"aria-valuemin" : this.min,
								"aria-valuemax" : this.options.max,
								"aria-valuenow" : this._value()
							});

			this.valueDiv = $("<div class='ui-progressbar-label'></div>")
					.appendTo(this.element);

			this.valueDiv = $("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>")
					.appendTo(this.element);

			this.oldValue = this._value();
			this._refreshValue();
		},

		_destroy : function() {
			this.element
					.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all")
					.removeAttr("role").removeAttr("aria-valuemin")
					.removeAttr("aria-valuemax").removeAttr("aria-valuenow");

			this.valueDiv.remove();
		},

		value : function(newValue) {
			if (newValue === undefined) {
				return this._value();
			}

			this._setOption("value", newValue);
			return this;
		},

		_setOption : function(key, value) {
			if (key === "value") {
				// var oldVal = this.options.value;
				this.options.value = value;
				this._refreshValue();

				if (this.onValueChange)
					this.onValueChange.apply(this, [{
										oldVal : this.oldValue,
										newVal : value
									}]);

				if (this._value() === this.options.max) {
					// this._trigger( "complete" );
					if (this.onComplete)
						this.onComplete.apply(this);
				}
			} else if (key === "label") {
				$(this.element).find(".ui-progressbar-label").html(value);
			} else if (key === "max") {
				this.options.max = value;
			}

			// this._super( key, value );
		},

		_value : function() {
			var val = this.options.value;
			// normalize invalid value
			if (typeof val !== "number") {
				val = 0;
			}
			return Math.min(this.options.max, Math.max(this.min, val));
		},

		_percentage : function() {
			return 100 * this._value() / this.options.max;
		},

		_refreshValue : function() {
			var value = this.value(), percentage = this._percentage();

			if (this.oldValue !== value) {
				this.oldValue = value;
				// this._trigger( "change" );
			}

			this.valueDiv.toggle(value > this.min).toggleClass(
					"ui-corner-right", value === this.options.max)
					.width(percentage.toFixed(0) + "%");
			this.element.attr("aria-valuenow", value);

			// $(this.element).find(".ui-progressbar-label").html(value + "%");
		},

		set : function(key, value) {
			this._setOption(key, value);
		}
	};

})(jQuery);